home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 051-075 / 073 / parout / parout.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  4KB  |  139 lines

  1. /* parout.c - Parallel port resource example.
  2.  *
  3.  * Phillip Lindsay (c) Commodore-Amiga, Inc.    
  4.  *     Unlimited use granted as long as copyright notice remains intact.
  5.  *
  6.  */
  7. #include <exec/types.h>
  8. #include <exec/nodes.h>
  9. #include <exec/lists.h>
  10. #include <exec/interrupts.h>
  11. #include <hardware/custom.h>
  12. #include <hardware/intbits.h>
  13. #include <hardware/cia.h>
  14. #include <resources/misc.h>
  15. #include <resources/cia.h>    /* this header has defines for hardware addresses */
  16.  
  17. #define CIAA_DDRPBOUT    0xff    /* CIAA port B all "ouputs" */
  18.  
  19. #define MANX    /* using MANX Aztec C */
  20.  
  21. #ifdef MANX
  22. #include <functions.h>
  23. #endif
  24.  
  25. extern CPTR  GetMiscResource();
  26. extern VOID  FreeMiscResource();
  27. extern ULONG CIAARoutine();
  28.  
  29. struct MiscResource *MiscResource=NULL;
  30. CPTR               CIAAResource=NULL;
  31.  
  32. char *myname = "myparallel";
  33. char *teststr= "This is a test line being sent to a parallel device.\n";
  34.  
  35. struct Task *mytask;
  36. LONG        mysignal;
  37. ULONG        mysigmask;
  38.  
  39. main()
  40. {
  41.     struct Interrupt CIAAInterrupt;
  42.     register count=0;
  43.     
  44.     MiscResource = (struct MiscResource *) OpenResource(MISCNAME);
  45.     if(!MiscResource) exit(10);
  46. puts("after open misc.resource");
  47.  
  48.     CIAAResource = (CPTR) OpenResource(CIAANAME);
  49.         if(!CIAAResource) exit(20);
  50. puts("after open ciaa.resource");
  51.     
  52. /* this is where we get our 8bits for parallel transfer */
  53.     if(GetMiscResource(MiscResource,MR_PARALLELPORT,myname)) exit(30);
  54. puts("after GetMiscResource PARALLELPORT (CIAA Port B)");
  55.  
  56. /* this is where we get busy(bit 0), pout(bit 1), sel(bit 2) */
  57.     if(GetMiscResource(MiscResource,MR_PARALLELBITS,myname))
  58.      {
  59.       FreeMiscResource(MiscResource,MR_PARALLELPORT);
  60.           exit(40);
  61.      }
  62. puts("after GetMiscResource PARALLELBITS BUSY/POUT/SEL (CIAB Port A bits 0,1,2)");
  63.  
  64.     if((mysignal = AllocSignal(-1L)) == -1L)
  65.      {
  66.       FreeMiscResource(MiscResource,MR_PARALLELPORT);
  67.       FreeMiscResource(MiscResource,MR_PARALLELBITS);
  68.           exit(50);
  69.      }
  70. puts("after AllocSignal()");
  71.  
  72.     mysigmask = 1L << mysignal;
  73.  
  74.     /* now we own the parallel port, next handshake interrupt ACK */
  75.     setmem(&CIAAInterrupt,(ULONG)sizeof(CIAAInterrupt),(ULONG)'\0');
  76. puts("after setmem()");
  77.     CIAAInterrupt.is_Data = (APTR)      CIAAResource;
  78.     CIAAInterrupt.is_Code = (VOID(*)()) CIAARoutine;
  79.     CIAAInterrupt.is_Node.ln_Type = NT_INTERRUPT;
  80.     CIAAInterrupt.is_Node.ln_Name = myname;
  81. puts("after interrupt init");
  82.     if(AddICRVector(CIAAResource,CIAICRB_FLG,&CIAAInterrupt))
  83.      {
  84.       FreeMiscResource(MiscResource,MR_PARALLELPORT);
  85.       FreeMiscResource(MiscResource,MR_PARALLELBITS);
  86.       FreeSignal(mysignal);
  87.           exit(50);
  88.      }
  89. puts("after AddICRVector()");
  90.  
  91.     /* disable ACK interrupt */
  92.     AbleICR(CIAAResource,CIAICRF_FLG);
  93. puts("after AbleICR() disable flag interrupt");
  94.  
  95.     /* set up direction for i/o ports used */
  96.     ciaa.ciaddrb = CIAA_DDRPBOUT;    /* make CIAA port B all "ouputs" */
  97.  
  98.     /* make BUSY, SEL, POUT "inputs" on CIAA port A */
  99.     ciab.ciaddra &= ( ~CIAF_PRTRBUSY | ~CIAF_PRTRPOUT | ~CIAF_PRTRSEL ); 
  100.  
  101.     /* clear any pending interrupts */
  102.     SetICR(CIAAResource,CIAICRF_FLG);
  103. puts("after SetICR() clear pending flag interrupts");
  104.  
  105.     /* enable ACK interrupt */
  106.     AbleICR(CIAAResource,CIAICRF_SETCLR|CIAICRF_FLG);
  107. puts("after AbleICR() enable flag interrupt");
  108.  
  109.     while(teststr[count])
  110.      {
  111.       if(ciab.ciapra & CIAF_PRTRBUSY) /* make sure device is not busy */    
  112.        continue;    
  113.       ciaa.ciaprb = teststr[count++]; /* write data to port */
  114.       wait(mysigmask);          /* wait for ack    */
  115.      }    
  116.  
  117.     AbleICR(CIAAResource,CIAICRF_FLG);    /* disable interrupt */
  118.     /* remove interrupt */
  119.     RemICRVector(CIAAResource,CIAICRB_FLG,&CIAAInterrupt);
  120.     /* free resources */ 
  121.     FreeMiscResource(MiscResource,MR_PARALLELPORT);
  122.     FreeMiscResource(MiscResource,MR_PARALLELBITS);
  123.     FreeSignal(mysignal);
  124. }
  125. /* end of main() */
  126.  
  127.  
  128. ULONG    CIAARoutine()
  129. {
  130. #ifdef MANX
  131.     geta4();    
  132. #endif  
  133.     Signal(mytask,mysigmask);
  134.     return(0L);
  135. }
  136.  
  137. /* eof */
  138.  
  139.